package com.xiaoshuidi.cloud.module.contract.dal.dataobject.bill;

import com.baomidou.mybatisplus.annotation.*;
import com.xiaoshuidi.cloud.framework.mybatis.core.dataobject.DeptFilter;
import com.xiaoshuidi.cloud.framework.tenant.core.db.TenantBaseDO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.orderFees.OrderFeesCreateReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 账单 DO
 *
 * @author 合房租赁
 */
@TableName(value = "contract_rentorder", autoResultMap = true)
@KeySequence("contract_rentorder_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RentOrderDO extends TenantBaseDO implements DeptFilter {

    /**
     * 账单id
     */
    @TableId
    private Long id;
    /**
     * 序号
     */
    private String uuid;

    /**
     * 账单编号
     */
    private String orderNo;
    /**
     * 序号
     */
    private Integer num;
    /**
     * 总期数
     */
    private Integer totalNum;

    /**
     * 支付流水号
     */
    private String tradeSerialNo;
    /**
     * 发票id
     */
    private Long invoiceId;
    /**
     * 业务id 如 合同id 、预定id
     */
    private Long businessId;
    /**
     * 租客姓名
     * */
    private String customerName;
    /**
     * 租客手机号
     */
    private String customerPhone;

    /**
     * 公寓id
     */
    private Long apartmentId;

    /**
     * 公寓名称
     */
    private String apartmentName;

    /**
     * 房间id
     */
    private Long roomId;

    /**
     * 房间名称
     */
    private String roomName;
    /**
     * 原账单id
     */
    private Long oldOrderId;

    /**
     * 此订单开始时间
     */
    private LocalDate startTime;

    /**
     * 此订单结束时间
     */
    private LocalDate endTime;

    /**
     * 已收账单总额
     */
    private BigDecimal paidRentUtilities;
    /**
     * 实付金额
     */
    private BigDecimal actualPaymentAmount;

    /**
     * 账单总金额
     */
    private BigDecimal totalAmount;

    /**
     * 租金金额
     */
    private BigDecimal rentAmount;

    /**
     * 押金金额
     */
    private BigDecimal depositAmount ;

    //冲调金额
    private BigDecimal readjustAmount;

    /**
     * 杂费金额
     * */
    private BigDecimal extrasAmount ;

    /**
     * 租金押金金额
     */
    private BigDecimal rentDeposit ;

    /**
     * 优惠金额
     */
    private BigDecimal discountAmount;

    /**
     * 优惠券优惠金额
     */
    private BigDecimal couponDiscount;

    /**
     * 优惠前原租金
     */
    private BigDecimal rawAmount;

    /**
     * 原押金
     */
    private BigDecimal oldDepositAmount;

    /**
     * 交易来源 Offline 线下 | online 线上
     * */
    private String transactionSource;

    /**
     * 支付状态(unpaid 待支付 |payment 已支付|part  部分支付),
     */
    private String payStatus;

    /**
     * 付款方式(0 alipay 支付宝 |1 dida 滴答付 |2 weixin 微信 |3 cash 现金 |4 bank 银行转账|5 system 系统标记为已支付|6 pos 线下POS |7 h2ome 水滴金融 |8 llian 连连支付 |9,  other 其他 |10 allinpay 银行卡在线支付|11 allinpaywx 微信在线支付|12 allinpayh5 银行卡小额支付 |13 pinganwx 微信支付 |14 daikou 银行代扣|15 ldpay 快捷支付|16 ldalipay 支付宝支付,
     */
    private String payMethod;
    /**
     * 此订单支付时间
     */
    private LocalDate oughtPayTime;

    /**
     * 此订单最晚支付时间
     */
    private LocalDate deadlinePayTime;

    /**
     * 此订单实际支付时间
     */
    private LocalDateTime actualPayTime;

    /**
     * 结算状态(0, 未结算|1, 已结算),
     */
    private Integer payOutStatus;

    /**
     * 已经提醒次数
     */
    private Integer remindTimes;

    /**
     * 上次提醒时间
     */
    private LocalDateTime lastRemindTimes;
    /**
     * 事务处理状态(0 默认| 1 已编辑 | 2 已发送),
     */
    private Integer todoStatus;
    /**
     * 是否需要读表
     */
    private Integer isMeterNeed;
    /**
     * 审批状态(notReview  无需审核|inReview 审核中|effective 已生效|(reject 已驳回)
     */
    private String approvedStatus;
    /**
     * 账单类型 default 合同账单| custom 杂费账单| free  免租期账单| meter  抄表账单| carry 结转账单 | owner 业主账单
     */
    private String orderType;
    /**
     * 支付次数
     */
    private Integer payTimes;
    /**
     * 是否已清算
     */
    private Integer cleared;
    /**
     * 账单归属人
     */
    private Integer roommateId;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 核销状态
     */
    private Integer writeOffStatus;
    /**
     * 付款人
     */
    private String payer;
    /**
     * 电子发票开票状态
     * 0 未申请 1 开票中 2 已开票 3 开票失败 4 已红冲 5 已作废 6 已换开  7 红冲申请中 8 红冲确认中 9红冲失败 11 标记已开票
     */
    private Integer invoiceStatus;

    /**
     * 限制开票 0可以开票不限制 1不可开票限制
     */
    private Integer restrictedInvoice;
    /**
     * 收款备注
     */
    private String receivePaymentComments;

    /**
     * 备注
     */
    private String remark;

    /**
     * 资金流向 0 流入 | 1 流出
     */
    private Integer flowType;

    /**
     * 企业账单批次号
     */
    private String companyOrderBatchNo;

    /*
     * 账单明细
     * */
    @TableField(exist = false)
    List<OrderFeesCreateReqVO> feeDetail;

    /**
     * 企业账单子账单ids
     */
    @TableField(exist = false)
    List<Long> companyOrderIds;

    /**
     * 审批流程id
     */
    private String processInstance;
    /**
     * 个人客户时不为空, 租户ID
     */
    private Long memberId;
    /**
     * 经办人名
     */
    private String operatorName;

    @TableField(fill = FieldFill.INSERT)
    private Long deptId;

    @Override
    public void setDeptId(Long deptId) {
        this.deptId = deptId;
    }
    /**
     * 业主合同是否中止付款
     */
    private Boolean suspend;
    /**
     * 业主璀璨中止付款操作时间
     */
    private LocalDateTime suspendAt;

    /**
     * 工单id
     */
    @Schema(description = "工单id")
    private Long sowTicketId;


    /**
     * 账单原状态
     */
    private String oldPayStatus;

}
